#include "cpu/exec/template-start.h"
#define instr ret
// //处理无参数返回
// make_helper(concat(ret_n_, SUFFIX)){
//     cpu.eip = MEM_R(reg_l(R_ESP));      //栈中读取返回地址
//     //数据字节为2，更新EIP以适应16位地址
//     if(DATA_BYTE == 2)cpu.eip &= 0xffff;
//     reg_l(R_ESP) += DATA_BYTE;      //增加栈指针弹出返回地址
//     print_asm("ret");
//     return 0;
// }
// //处理带参数返回
// make_helper(concat(ret_i_, SUFFIX)){
//     int val = instr_fetch(eip + 1, DATA_BYTE);
//     cpu.eip = MEM_R(REG(R_ESP));
//     if(DATA_BYTE == 2)cpu.eip &= 0xffff;
//     REG(R_ESP) += DATA_BYTE;
//     //清空返回地址之后的栈空间
//     int i;
//     for(i = 0; i < val; i += DATA_BYTE)MEM_W(REG(R_ESP) + i, 0);
//     REG(R_ESP) += val;      //更新栈指针以移除参数
//     print_asm("ret\t$0x%x", val);
//     return 0;
// }

make_helper(concat(ret_n_, SUFFIX)) {
  cpu.eip = MEM_R(reg_l(R_ESP)) - 1;
  reg_l(R_ESP) += DATA_BYTE;
  print_asm("ret");
  return 1;
}

make_helper(concat(ret_i_, SUFFIX)) {
  uint32_t num = instr_fetch(eip + 1, 2);
  cpu.eip = MEM_R(reg_l(R_ESP)) - 3;
  reg_l(R_ESP) += DATA_BYTE;
  reg_l(R_ESP) += num;
  print_asm("ret 0x%x", num);
  return 3;
}

#include "cpu/exec/template-end.h"